/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import controlador.CargaPanel;
import controlador.ContenedorComponente;
import dao.GrupoDAO;
import dao.HistorialDAO;
import dao.NaveDAO;
import dao.ProductorDAO;
import dao.ReferenciaSustratoDAO;
import dao.SensorRegistroDAO;
import java.beans.DesignMode;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Time;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JList;
import modelo.Grupo;
import modelo.Historial;
import modelo.Nave;
import modelo.Productor;
import modelo.ReferenciaSustrato;
import modelo.SensorRegistro;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 *
 * @author Elias Mendoza
 */
public class OperacionBaseDatos {

  private Date tiempoSistema, fecha;
  private SimpleDateFormat formatoHora = new SimpleDateFormat("hh:mm:ss");
  ;
  private SimpleDateFormat formatoFecha;
  private Time hora;
  ContenedorComponente cc;
  ArrayList<Componente> lista = new ArrayList<Componente>();

  public OperacionBaseDatos(ContenedorComponente cc) {
    this.cc = cc;
  }

  public OperacionBaseDatos() {
  }

  public void insertarRegistroSensores(ArrayList<GrupoSensores> grupoSensores) {
    HistorialDAO hd = new HistorialDAO();
    SensorRegistro sr = new SensorRegistro();
    tiempoSistema = new Date();
    hora = Time.valueOf(formatoHora.format(tiempoSistema).toString());
    SensorRegistroDAO srd = new SensorRegistroDAO();
    int con = 1;
    if (cc.numFilas() > 0) {
      cc.vaciaTabla();
    }
    String lec = "Lectura Registrada";
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    for (GrupoSensores gs : grupoSensores) {
      if (gs.getGrupo().equals("A")) {
        
        sr.setA(Float.parseFloat(gs.getVsensor1())); dataset.setValue(sr.getA(), lec, "A");
        sr.setB(Float.parseFloat(gs.getVsensor2())); dataset.setValue(sr.getB(), lec, "B");
        sr.setC(Float.parseFloat(gs.getVsensor3())); dataset.setValue(sr.getC(), lec, "C");
        sr.setD(Float.parseFloat(gs.getVsensor4())); dataset.setValue(sr.getD(), lec, "D");
      }
      if (gs.getGrupo().equals("B")) {
        sr.setE(Float.parseFloat(gs.getVsensor1())); dataset.setValue(sr.getE(), lec, "E");
        sr.setF(Float.parseFloat(gs.getVsensor2())); dataset.setValue(sr.getF(), lec, "F");
        sr.setG(Float.parseFloat(gs.getVsensor3())); dataset.setValue(sr.getG(), lec, "G");
        sr.setH(Float.parseFloat(gs.getVsensor4())); dataset.setValue(sr.getH(), lec, "H");
      }
      if (gs.getGrupo().equals("C")) {
        sr.setI(Float.parseFloat(gs.getVsensor1())); dataset.setValue(sr.getI(), lec, "I");
        sr.setJ(Float.parseFloat(gs.getVsensor2())); dataset.setValue(sr.getJ(), lec, "J");
        sr.setK(Float.parseFloat(gs.getVsensor3())); dataset.setValue(sr.getK(), lec, "K");
        sr.setL(Float.parseFloat(gs.getVsensor4())); dataset.setValue(sr.getL(), lec, "L");
      }
      if (gs.getGrupo().equals("D")) {
        sr.setM(Float.parseFloat(gs.getVsensor1())); dataset.setValue(sr.getM(), lec, "M");
        sr.setN(Float.parseFloat(gs.getVsensor2())); dataset.setValue(sr.getN(), lec, "N");
        sr.setO(Float.parseFloat(gs.getVsensor3())); dataset.setValue(sr.getO(), lec, "O");
        sr.setP(Float.parseFloat(gs.getVsensor4())); dataset.setValue(sr.getP(), lec, "P");
      }
      cc.addFila("" + con++, getHumedad(Float.parseFloat(gs.getVsensor1()), Float.parseFloat(gs.getVal_ref())) + "%", gs.getVal_ref().toString());
      cc.addFila("" + con++, getHumedad(Float.parseFloat(gs.getVsensor2()), Float.parseFloat(gs.getVal_ref())) + "%", gs.getVal_ref().toString());
      cc.addFila("" + con++, getHumedad(Float.parseFloat(gs.getVsensor3()), Float.parseFloat(gs.getVal_ref())) + "%", gs.getVal_ref().toString());
      cc.addFila("" + con++, getHumedad(Float.parseFloat(gs.getVsensor4()), Float.parseFloat(gs.getVal_ref())) + "%", gs.getVal_ref().toString());

    }

    sr.setHora(hora);
    sr.setHistorial(hd.getHistorialbyId(verificaInsertaHistorial("0")));
    srd.guardar(sr);
    cc.getUltRegistro().setText("" + sr.getId());
    cc.getUltHora().setText("" + hora);
    
    JFreeChart chart = ChartFactory.createLineChart("Registro de Humedad de Sensores", "Lectura",
   "Humedad", dataset, PlotOrientation.VERTICAL, true,
   true, false);
    ChartPanel grafico = new ChartPanel(chart);
    CargaPanel cp = new CargaPanel(cc.getPanelGrafica1());
    cp.cargaPanelGrafica1(grafico);
    

  }

  public int verificaInsertaHistorial(String dn) {
    int id = 0;
    Historial h;
    HistorialDAO hd;
    FechaHora fh = new FechaHora();
    hd = new HistorialDAO();
    id = hd.ultimoRegistro();
    h = (Historial) hd.getHistorialbyId(id);
    if ((!h.getFecha().equals(fh.getFecha())) || (h.getDiaNoche() != Integer.parseInt(dn))) {
      h = new Historial();
      h.setDiaNoche(Integer.parseInt(dn));
      h.setFecha(fh.getFecha());
      hd = new HistorialDAO();
      hd.guardar(h);
      cc.getUltFecha().setText("" + fh.getFecha());
      return h.getId();
    }
    cc.getUltFecha().setText("" + h.getFecha());
    return id;
  }

  public <Registro> boolean insertarFormulario(Registro r) {
    Class clase;
    Object objeto;
    Method guardar;
    Class[] claseParametro;
    Object[] parametro;
    try {
      clase = Class.forName("dao." + r.getClass().getSimpleName() + "DAO");
      objeto = clase.newInstance();
      claseParametro = new Class[1];
      claseParametro[0] = Class.forName("java.lang.Object");
      guardar = clase.getMethod("guardar", claseParametro);
      parametro = new Object[1];
      parametro[0] = r;
      guardar.invoke(objeto, parametro);

    } catch (NoSuchMethodException e) {
      System.out.println("Error al acceder al metodo. " + e);
      return false;
    } catch (SecurityException e) {
      System.out.println("Error al acceder al metodo. " + e);
      return false;
    } catch (InvocationTargetException e) {
      System.out.println("Error al ejecutar el metodo. " + e);
      return false;
    } catch (InstantiationException e) {
      System.out.println("Error al instanciar el objeto. " + e);
      return false;
    } catch (IllegalAccessException e) {
      System.out.println("Error al instanciar el objeto. " + e);
      return false;
    } catch (ClassNotFoundException e) {
      return false;
    }
    return true;

  }

  public String getHumedad(float hum, float valReferencia) {
    DecimalFormat df = new DecimalFormat("0.00");
    double humedad = (float) 0.00;
    humedad = hum * 100 / valReferencia;
    return df.format(humedad);
  }

  public void consultaProductores(JComboBox cb) {
    ProductorDAO pd = new ProductorDAO();
    List listProductores = pd.consultaTodo();
    for (Object i : listProductores) {
      Productor p = (Productor) i;
      cb.addItem(p);
    }
  }

  public void consultaNaves(JComboBox cb) {
    NaveDAO nd = new NaveDAO();
    List listNaves = nd.consultaTodo();
    for (Object i : listNaves) {
      Nave n = (Nave) i;
      cb.addItem(n);
    }
  }

  public void consultaReferencia(JComboBox cb) {
    ReferenciaSustratoDAO rsd = new ReferenciaSustratoDAO();
    List listReferencias = rsd.consultaTodo();
    for (Object i : listReferencias) {
      ReferenciaSustrato rs = (ReferenciaSustrato) i;
      cb.addItem(rs);
    }
  }

  public void consultaGrupos(DefaultListModel modelo) {
    boolean disponible;
    GrupoDAO gd = new GrupoDAO();
    List listGrupos = gd.consultaTodo();
    for (int con = 65; con <= 90; con++) {
      disponible = true;
      char letra = (char) con;
      for (Object i : listGrupos) {
        Grupo rs = (Grupo) i;
        if (rs.getGrupo() == letra) {
          disponible = false;
          break;
        }
      }
      if (disponible) 
        modelo.addElement(letra);
      System.out.println(letra);
    }
  }
}
